package com.example.music.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.music.model.Music;
import com.example.music.model.User;
import com.example.music.service.MusicService;
import com.example.music.util.Constant;
import com.example.music.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * ClassName: MusicController
 * Package: com.example.music.controller
 * Description:
 * User: fzykd
 *
 * @Author: LQH
 * Date: 2023-04-14
 * Time: 10:36
 */

@RestController
@RequestMapping("/music")
public class MusicController {
    //上传音乐的接口设计
    /*
        {
            请求
            post,
            /music/upload
            {Singer,MultipartFile file} 歌手 和 音乐文件
        }

        响应
        {
            "status":0,
            "message":"上传成功!",
            "data":ture
        }
     */
    //定义一个具体的本地路径 保存上传来的音乐
    //private String SAVE_PATH = "E:/Data/music/";

    //读取配置文件获取数据
    @Value("${music.local.path}")
    private String SAVE_PATH;

    @Autowired
    private MusicService musicService;

    //读取配置文件
    @Value("${img.path}")
    private String pathImg;

    @PostMapping("/upload")
    public Result<Boolean> insertMusic(@RequestParam String singer,
                                       @RequestParam("filename") MultipartFile file,
                                       HttpServletRequest request,
                                       HttpServletResponse response) throws IOException {
        //能上传 说明已经登录了 所以要检查一下是否登录成功
        //1.首先检查是否登录 获取Session对象
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
            System.out.println("没有登录");
            return new Result<>(-1, "请登录之后上传", false);
        }

        //getOriginalFilename() 这个方法获取文件完整名称 包括文件名称+文件扩展名
        String fileNameAndType = file.getOriginalFilename(); //×××.mp3

        System.out.println(fileNameAndType);

        //最终文件位置 + 名字
        String path = SAVE_PATH + fileNameAndType;
        System.out.println(path);

        //判断这个目录是否存在 没有带上文件名
        File dest = new File(SAVE_PATH);
        //可能存在dest不存在 不存在就创建
        if (!dest.exists()) {
            dest.mkdir();
        }

        //然后开始文件上传 将接收到的文件传输到给定目标路径
        try {
            file.transferTo(new File(path));
            //return new Result<>(0,"上传成功",true);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //return new Result<>(-1,"上传失败",false);
        //以上是 将文件上传到了服务器 成功之后 还要将对应关系 上传到数据当中

        //准备数据库上传
        //1.获取歌曲的名字 去掉后缀
        //从最后向前 找到第一个点. 返回下标
        int index = fileNameAndType.lastIndexOf(".");
        String title = fileNameAndType.substring(0, index);

        //获取到UserId 通过Session获取到
        User user = (User) session.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userId = user.getId();

        //获取数据库 保存的地址 之后是播放音乐的路径 http请求的一个路径
        String url = "music/get?path=" + title;

        //获取上传的时间
        SimpleDateFormat fs = new SimpleDateFormat("yyyy-MM-dd");
        String time = fs.format(new Date());

        Music music = new Music();
        music.setSinger(singer);
        music.setTitle(title);
        music.setTime(time);
        music.setUrl(url);
        music.setUserid(userId);

        //准备好之后 插入数据库
        boolean ret = musicService.save(music);
        if (ret) {
            //上传成功之后 跳转到 指定页面
            response.sendRedirect("/list.html");
            return new Result<>(1, "上传成功", true);
        }else {
            return new Result<>(-1, "上传失败", false);
        }
    }

    //播放音乐的接口
    @GetMapping("/get")
    public ResponseEntity<byte[]> getMusic(String path){
        /**
         * 请求 get, 音乐存放的路径 music/get?path=×××.mp3
         * 响应: 音乐数据本身的字节信息
         */
        //后缀 加载这里 也比较保险 不是音频文件上传成功 也不能播放
        File file = new File(SAVE_PATH + path);
        byte[] a = null;
        try {
            a = Files.readAllBytes(file.toPath());
            if (a == null){
                return ResponseEntity.badRequest().build();
            }
            return ResponseEntity.ok(a);
            //同样也可以返回图片的字节码 但是音乐字节码需要播放器解码播放
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.badRequest().build();
    }


    //删除单个音乐接口
    @DeleteMapping("/delete")
    public Result deleteMusicById(@RequestParam("id") List<Integer> id){
        //根据前端 传来的ID进行删除

        //定义一个删除的计数器
        int ret = 0;

        //数据当中 可以直接批量 删除 但是 服务器 本地 要删除文件 查找到对应的文件名进行删除
        for (int i = 0; i < id.size(); i++) {
            //1.通过Id去数据中查找 是否存在该歌曲
            Music music = musicService.getById(id.get(i));
            //如果音乐 存在 获取到音乐的名称
            if (music != null){
                //获取到音乐名称
                String title = music.getTitle();
                //然后本地服务器的音乐
                System.out.println(title);
                File file = new File(SAVE_PATH + title + ".mp3");
                if (file.delete()){
                    ret = ret + 1;
                    System.out.println("删除成功");
                }else {
                    System.out.println("删除失败");
                    return new Result(-1,"没有要删除的歌曲",music);
                }
            }
        }
        //出来对计数器进行判断
        if(ret == id.size()){
            System.out.println("全部删除成功");
            boolean boo = musicService.removeBatchByIds(id);
            if (boo){
                return new Result(1,"全部删除成功",true);
            }else {
                return new Result(-1,"全部删除失败",false);
            }

        }else {
            System.out.println("全部删除失败!");

            return new Result(-1,"全部删除失败",false);
        }

    }

    //查询音乐
    @GetMapping("/findmusic")
    public Result<List<Music>> findMusic(@RequestParam(value = "name",required = false) String musicName){
        //通过音乐名称 查询 但有参数时候 模糊 查询 没有参数的时候 全部查询

        //创造条件构造器
        LambdaQueryWrapper<Music> queryWrapper = new LambdaQueryWrapper<>();

        //isEmpty 是空 才返回ture
        if (musicName != null){
            queryWrapper.like(!musicName.isEmpty(),Music::getTitle,musicName);
        }
        //根据id升序排列
        queryWrapper.orderByAsc(Music::getId);

        return new Result<>(1,"查找到的数据",musicService.list(queryWrapper));

    }


}
